import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.util.Random;

public class CRC {
	public static int[] CRC8_TAB = {
			0x00,0x5e,0xbc,0xe2,0x61,0x3f,0xdd,0x83,0xc2,0x9c,0x7e,0x20,0xa3,0xfd,0x1f,0x41,
			0x9d,0xc3,0x21,0x7f,0xfc,0xa2,0x40,0x1e,0x5f,0x01,0xe3,0xbd,0x3e,0x60,0x82,0xdc,
			0x23,0x7d,0x9f,0xc1,0x42,0x1c,0xfe,0xa0,0xe1,0xbf,0x5d,0x03,0x80,0xde,0x3c,0x62,
			0xbe,0xe0,0x02,0x5c,0xdf,0x81,0x63,0x3d,0x7c,0x22,0xc0,0x9e,0x1d,0x43,0xa1,0xff,
			0x46,0x18,0xfa,0xa4,0x27,0x79,0x9b,0xc5,0x84,0xda,0x38,0x66,0xe5,0xbb,0x59,0x07,
			0xdb,0x85,0x67,0x39,0xba,0xe4,0x06,0x58,0x19,0x47,0xa5,0xfb,0x78,0x26,0xc4,0x9a,
			0x65,0x3b,0xd9,0x87,0x04,0x5a,0xb8,0xe6,0xa7,0xf9,0x1b,0x45,0xc6,0x98,0x7a,0x24,
			0xf8,0xa6,0x44,0x1a,0x99,0xc7,0x25,0x7b,0x3a,0x64,0x86,0xd8,0x5b,0x05,0xe7,0xb9,
			0x8c,0xd2,0x30,0x6e,0xed,0xb3,0x51,0x0f,0x4e,0x10,0xf2,0xac,0x2f,0x71,0x93,0xcd,
			0x11,0x4f,0xad,0xf3,0x70,0x2e,0xcc,0x92,0xd3,0x8d,0x6f,0x31,0xb2,0xec,0x0e,0x50,
			0xaf,0xf1,0x13,0x4d,0xce,0x90,0x72,0x2c,0x6d,0x33,0xd1,0x8f,0x0c,0x52,0xb0,0xee,
			0x32,0x6c,0x8e,0xd0,0x53,0x0d,0xef,0xb1,0xf0,0xae,0x4c,0x12,0x91,0xcf,0x2d,0x73,
			0xca,0x94,0x76,0x28,0xab,0xf5,0x17,0x49,0x08,0x56,0xb4,0xea,0x69,0x37,0xd5,0x8b,
			0x57,0x09,0xeb,0xb5,0x36,0x68,0x8a,0xd4,0x95,0xcb,0x29,0x77,0xf4,0xaa,0x48,0x16,
			0xe9,0xb7,0x55,0x0b,0x88,0xd6,0x34,0x6a,0x2b,0x75,0x97,0xc9,0x4a,0x14,0xf6,0xa8,
			0x74,0x2a,0xc8,0x96,0x15,0x4b,0xa9,0xf7,0xb6,0xe8,0x0a,0x54,0xd7,0x89,0x6b,0x35
			};
	public static int CRC8_Tab(int[] ucPtr,int ucLen){
        int ucIndex;//CRC8校验表格索引
        int ucCRC8 =0;//CRC8字节初始化
        int i = 0;
        //进行CRC8位校验
        while(ucLen--!=0){
            ucIndex=ucCRC8^(ucPtr[i++]);
            ucCRC8=CRC8_TAB[ucIndex];
        }
        //返回CRC8校验数据              
        return (ucCRC8);
    }
	
	
//	  测试
 	public static void main(String[] args) {//12-23-34-45-56-78
 		
 		
		String filePath ="01-01-01-01-05-01.txt";
		File file = new File(filePath);
 
		System.out.println("filePath"+file.getAbsolutePath());
		if (file.exists()) {
			file.delete();
		}
 
		// 设定mac地址起始地址, 以及本次生成的数量
		printMac(filePath, "01:01:01:01:05:01", 100);
 	

		
		
 		
 	}
 	/**
	 * 生成mac地址核心逻辑
	 * 
	 * @Description:
	 * @author 666
	 * @date Apr 4, 2018
	 * @param filePath
	 * @param start
	 * @param count
	 */
	private static void printMac(String filePath, String start, int count) {
		start = start.replaceAll(":", "");
		try {
			File file = new File(filePath);
			FileWriter writer = new FileWriter(file, true);
			BigInteger num = new BigInteger(start, 16);
//			System.out.println("num:"+num);
			BigInteger addNum = new BigInteger("1");
			String result = "";
			for (int i = 0; i < count; i++) {
				result = num.toString(16).toUpperCase();
//				System.out.println("result1:"+result);
				for (int j = 12 - result.length(); j > 0; j--) {
					result = "0" + result;
				}
				System.out.println("result2:"+result);
				writer.write(getMacAdr(result) + "\n");
 
				num = num.add(addNum);
			}
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 
	/**
	 * 组成mac地址
	 * 
	 * @Description:
	 * @author 666
	 * @date Apr 4, 2018
	 * @param str
	 * @return
	 */
	private static String getMacAdr(String str) {
		String decrypt_mac = new String("");
		for (int i = 1; i <= 12; i++) {
			decrypt_mac+=(str.charAt(i - 1));
			if (i % 2 == 0&&i != 12 ) {
				decrypt_mac+=("-");
			}
		}
//		System.out.println("decrypt_mac:"+decrypt_mac);
		String[] decryptarr_mac = decrypt_mac.split("-");
		byte[] data_mac = new byte[12];
		for (int i = 0; i < decryptarr_mac.length; i++) {
			data_mac[i] = (byte) Integer.parseInt(decryptarr_mac[i], 16);
//			System.out.println("data_mac["+i+"]:"+data_mac[i]);
		}
		String ddString  = getCRCData(data_mac)+decrypt_mac;
		AES aes = new AES();
		String ddString2 = null;
		try {
			ddString2 = aes.Encrypt(ddString);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(decrypt_mac+"-----对应的加密数据-----------："+ddString2);
		
		return decrypt_mac+":"+ddString2;
	}


 	
 	public static void method2(String file, String conent) {
 		BufferedWriter out = null;
 		try {
 		out = new BufferedWriter(new OutputStreamWriter(
 		new FileOutputStream(file, true)));
 		out.write(conent+"\r\n");
 		} catch (Exception e) {
 		e.printStackTrace();
 		} finally {
 		try {
 		out.close();
 		} catch (IOException e) {
 		e.printStackTrace();
 		}
 		}
 		}
// 	
 	public static String getCRCData(byte[] data) {
 		String serialNumber = "";
 		int[] enddata = new int[15];
 		int index = 0;
 		for (int i = 0; i < 6; i++) {
 			for (int j = i + 1; j < 6; j++) {
 				int[] temp = new  int[2];
 				temp[0] =   data[i];
 				temp[1] =   data[j];
 				enddata[index++] =CRC8_Tab(temp,2);
 				
 			}
 		}
 		for (int i = 0; i < 15; i++) {
 			String temp = null;
 			temp = temp.format("%d", enddata[i]);
 			serialNumber += temp;
 		}
 		
// 		byte crc = CRC8.calcCrc8(new byte[] { 12, 23});
 		System.out.println(serialNumber);
		return serialNumber;
	}
 	
}
